home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 176-200 / 190 / nethack / een.zoo / worn.c < prev    next >
C/C++ Source or Header  |  1988-07-24  |  1KB  |  67 lines

  1. /*    SCCS Id: @(#)worn.c     2.3     88/01/21
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include "hack.h"
  5.  
  6. struct worn {
  7.     long w_mask;
  8.     struct obj **w_obj;
  9. } worn[] = {
  10.     { W_ARM, &uarm },
  11.     { W_ARM2, &uarm2 },
  12.     { W_ARMH, &uarmh },
  13.     { W_ARMS, &uarms },
  14.     { W_ARMG, &uarmg },
  15.     { W_ARMU, &uarmu },
  16.     { W_RINGL, &uleft },
  17.     { W_RINGR, &uright },
  18.     { W_WEP, &uwep },
  19.     { W_BALL, &uball },
  20.     { W_CHAIN, &uchain },
  21.     { 0, 0 }
  22. };
  23.  
  24. setworn(obj, mask)
  25. register struct obj *obj;
  26. long mask;
  27. {
  28.     register struct worn *wp;
  29.     register struct obj *oobj;
  30.  
  31.     for(wp = worn; wp->w_mask; wp++) if(wp->w_mask & mask) {
  32.         oobj = *(wp->w_obj);
  33.         if(oobj && !(oobj->owornmask & wp->w_mask))
  34.             impossible("Setworn: mask = %ld.", wp->w_mask);
  35.         if(oobj) oobj->owornmask &= ~wp->w_mask;
  36.         if(obj && oobj && wp->w_mask == W_ARM){
  37.             if(uarm2) {
  38.                 impossible("Setworn: uarm2 set?");
  39.             } else
  40.                 setworn(uarm, W_ARM2);
  41.         }
  42.         *(wp->w_obj) = obj;
  43.         if(obj) obj->owornmask |= wp->w_mask;
  44.     }
  45.     if(uarm2 && !uarm) {
  46.         uarm = uarm2;
  47.         uarm2 = 0;
  48.         uarm->owornmask ^= (W_ARM | W_ARM2);
  49.     }
  50. }
  51.  
  52. /* called e.g. when obj is destroyed */
  53. setnotworn(obj) register struct obj *obj; {
  54.     register struct worn *wp;
  55.  
  56.     for(wp = worn; wp->w_mask; wp++)
  57.         if(obj == *(wp->w_obj)) {
  58.             *(wp->w_obj) = 0;
  59.             obj->owornmask &= ~wp->w_mask;
  60.         }
  61.     if(uarm2 && !uarm) {
  62.         uarm = uarm2;
  63.         uarm2 = 0;
  64.         uarm->owornmask ^= (W_ARM | W_ARM2);
  65.     }
  66. }
  67.